package com.dianshang.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.alibaba.fastjson.JSON;
import com.dianshang.dao.CategoryBrandDao;
import com.dianshang.dao.CategoryDao;
import com.dianshang.dao.SkuDao;
import com.dianshang.dao.SpuDao;
import com.dianshang.entity.PageResult;
import com.dianshang.pojo.goods.*;
import com.dianshang.service.goods.SpuService;
import com.dianshang.utils.IdWorker;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import tk.mybatis.mapper.entity.Example;

import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * @Service(interfaceClass = SpuService.class)
 * 注意！！！这个方法要对两个表进行操作,需要添加事务。
 */
@Service(interfaceClass = SpuService.class)
public class SpuServiceImpl implements SpuService {

    @Autowired
    private SpuDao spuDao;

    @Autowired
    private IdWorker idWorker;

    @Autowired
    private CategoryDao categoryDao;

    @Autowired
    private SkuDao skuDao;

    @Autowired
    private CategoryBrandDao categoryBrandDao;

    /**
     * 查询所有
     */
    @Override
    public List<Spu> findAll() {
        return spuDao.selectAll();
    }

    /**
     * 查询所有+分页
     * page 页码
     * size 每页记录数
     * 分页结果
     */
    @Override
    public PageResult<Spu> findPage(Integer page, Integer size) {
        PageHelper.startPage(page,size);
        Page<Spu> spus = (Page<Spu>) spuDao.selectAll();
        return new PageResult<Spu>(spus.getTotal(),spus.getResult());
    }

    /**
     * 查询所有+模糊
     * searchMap 查询条件
     */
    @Override
    public List<Spu> findList(Map<String, Object> searchMap) {
        Example example = createExample(searchMap);
        return spuDao.selectByExample(example);
    }

    /**
     * 查询所有+分页+模糊
     * searchMap
     * page
     * size
     */
    @Override
    public PageResult<Spu> findPage(Map<String, Object> searchMap, Integer page, Integer size) {
        PageHelper.startPage(page,size);
        Example example = createExample(searchMap);
        Page<Spu> spus = (Page<Spu>) spuDao.selectByExample(example);
        return new PageResult<Spu>(spus.getTotal(),spus.getResult());
    }

    /**
     * 回显
     * id
     */
    @Override
    public Spu findById(Integer id) {
        return spuDao.selectByPrimaryKey(id);
    }

    /**
     * 新增
     * spu
     */
    @Override
    public void add(Spu spu) {
        spuDao.insert(spu);
    }

    /**
     * 修改
     * spu
     */
    @Override
    public void update(Spu spu) {
        spuDao.updateByPrimaryKeySelective(spu);
    }

    /**
     * 删除
     * id
     */
    @Override
    public void delete(Integer id) {
        spuDao.deleteByPrimaryKey(id);
    }

    /**
     * 保存商品
     */
    @Override
    @Transactional // 事务会覆盖类的事务配置信息
    public void saveGoods(Goods goods) {
        // 保存一个spu的信息
        Spu spu = goods.getSpu();
        // 新增商品(spu)
        if (spu.getId() == null){
            // spuID 由雪花算法生成分布式ID
            spu.setId(idWorker.nextId()+"");
            spu.setSaleNum(0); // 销量
            spu.setCommentNum(0); // 评论数
            spu.setIsMarketable("1"); // 1:上架,0:下架
            spu.setIsEnableSpec("1"); // 是否启用规格
            spu.setIsDelete("0"); // 1:删除,0:未删除
            spu.setStatus("1"); // 1:通过,0:不通过
            spuDao.insert(spu); // 添加spu
        }else { // 修改
            // 删除原来的sku列表
            Example example = new Example(Sku.class);
            Example.Criteria criteria = example.createCriteria();
            criteria.andEqualTo("spuId",spu.getId());
            skuDao.deleteByExample(example);
            // 执行spu修改
            spuDao.updateByPrimaryKeySelective(spu);
        }
        // 保存sku列表的信息
        Date date = new Date();
        // 分类对象
        Category category = categoryDao.selectByPrimaryKey(spu.getCategory3Id());
        // 保存一个sku的信息
        List<Sku> skuList = goods.getSkuList();
        for (Sku sku : skuList) {
            // 新增商品(sku)
            if (sku.getId() == null){
                // skuID 由雪花算法生成分布式ID
                sku.setId(idWorker.nextId()+"");
            }
            // 不启用规格的sku处理
            if(sku.getSpec() == null || "".equals(sku.getSpec())){
                sku.setSpec("{}");
            }
            // sku名称 = spu名称 + 规格值列表
            String name = spu.getName();
            // sku.getSpec() {"颜色":"红","机身内存":"64G"}
            Map<String,String> specMap = JSON.parseObject(sku.getSpec(), Map.class);
            for (String value : specMap.values()) {
                name += " "+value; // vivo X23 8GB+128GB 幻夜蓝 水滴屏全面屏 游戏手机 移动联通电信全网通4G手机
            }
            sku.setSpuId(spu.getId()); // SPUID
            sku.setName(name); // 名称
            sku.setCreateTime(date); // 创建日期(当前日期)
            sku.setUpdateTime(date); // 修改日期(当前日期)
            sku.setCategoryId(spu.getCategory3Id()); // 分类id
            sku.setCategoryName(category.getName()); // 分类名称
            sku.setCommentNum(0); // 评论数
            sku.setSaleNum(0); // 销售数量
            skuDao.insert(sku); // 添加sku
        }
        // 建立分类和品牌的关联(spu表和category_brand表)
        CategoryBrand categoryBrand = new CategoryBrand();
        categoryBrand.setBrandId(spu.getBrandId());
        categoryBrand.setCategoryId(spu.getCategory3Id());
        int count = categoryBrandDao.selectCount(categoryBrand);
        if (count == 0){
            categoryBrandDao.insert(categoryBrand);
        }
    }

    /**
     * 查询商品组合
     * id
     */
    @Override
    @Transactional // 事务会覆盖类的事务配置信息
    public Goods findGoodsById(String id) {
        // 查询spu列表
        Spu spu = spuDao.selectByPrimaryKey(id);
        // 查询sku列表
        Example example=new Example(Sku.class);
        Example.Criteria criteria = example.createCriteria();
        criteria.andEqualTo("spuId",id);
        List<Sku> skuList = skuDao.selectByExample(example);
        // 封装为组合实体类
        Goods goods = new Goods();
        goods.setSpu(spu);
        goods.setSkuList(skuList);
        return goods;
    }

    /**
     * 商品审核
     */
    @Override
    public void audit(String id, String status) {
        // 修改状态 审核状态和上架状态
        Spu spu = spuDao.selectByPrimaryKey(id);
        // 审核通过 1:通过,0:不通过
        if (status.equals("1")){ // status.equals("1") == "1".equals(status)
            spu.setIsMarketable("1"); // 1:上架,0:下架
        }
        spu.setStatus(status);
        spuDao.updateByPrimaryKeySelective(spu);
    }

    /**
     * 商品批量审核通过
     */
    // 方法一(商品批量审核通过):
    /* @Override
    public void auditMany(List<Spu> spus) {
        for (Spu spu : spus) {
            if (spu.getStatus().equals("0") && spu.getIsDelete().equals("0") && spu.getIsMarketable().equals("0")){
                spu.setStatus("1"); // 审核通过 1:通过,0:不通过
                spu.setIsMarketable("1"); // 1:上架,0:下架
                spuDao.updateByPrimaryKeySelective(spu);
            }else {
                throw new RuntimeException("商品批量审核不通过");
            }
        }
    } */
    // 方法二(商品批量审核通过):
    @Override
    public int auditMany(String[] ids) {
        Spu spu = new Spu();
        spu.setStatus("1"); // 审核通过 1:通过,0:不通过
        spu.setIsMarketable("1"); // 1:上架,0:下架

        Example example = new Example(Spu.class);
        Example.Criteria criteria = example.createCriteria();
        criteria.andIn("id", Arrays.asList(ids));
        criteria.andEqualTo("isDelete", "0"); // 1:删除,0:未删除
        criteria.andEqualTo("status", "0"); // 审核通过 1:通过,0:不通过
        criteria.andEqualTo("isMarketable","0"); // 1:上架,0:下架
        return spuDao.updateByExampleSelective(spu, example);
    }

    /**
     * 下架商品
     */
    @Override
    public void pull(String id) {
        // 修改状态
        Spu spu = spuDao.selectByPrimaryKey(id);
        spu.setIsMarketable("0"); // 1:上架,0:下架
        spuDao.updateByPrimaryKeySelective(spu);
    }

    /**
     * 上架商品
     */
    @Override
    public void put(String id) {
        // 1.修改状态
        Spu spu = spuDao.selectByPrimaryKey(id);
        // 1:通过,0:不通过
        if(!spu.getStatus().equals("1") && spu.getStatus() == null){ // !spu.getStatus().equals("1") == !"1".equals(spu.getStatus())
            throw new RuntimeException("此商品未通过审核");
        }
        spu.setIsMarketable("1"); // 1:上架,0:下架
        spuDao.updateByPrimaryKeySelective(spu);
    }

    /**
     * 批量上架商品
     */
    @Override
    public int putMany(String[] ids) {
        // 修改状态
        Spu spu=new Spu();
        spu.setIsMarketable("1"); // 1:上架,0:下架
        // 批量修改
        Example example=new Example(Spu.class);
        Example.Criteria criteria = example.createCriteria();
        criteria.andIn("id", Arrays.asList(ids));
        criteria.andEqualTo("isMarketable","0"); // 1:上架,0:下架
        criteria.andEqualTo("status","1"); // 1:通过,0:不通过
        criteria.andEqualTo("isDelete","0"); // 1:删除,0:未删除
        return spuDao.updateByExampleSelective(spu, example);
    }

    /**
     * 批量下架商品
     */
    @Override
    public int pullMany(String[] ids) {
        // 修改状态
        Spu spu=new Spu();
        spu.setIsMarketable("0"); // 1:上架,0:下架
        // 批量修改
        Example example=new Example(Spu.class);
        Example.Criteria criteria = example.createCriteria();
        criteria.andIn("id", Arrays.asList(ids));
        criteria.andEqualTo("isMarketable","1"); // 1:上架,0:下架
        criteria.andEqualTo("status","1"); // 1:通过,0:不通过
        criteria.andEqualTo("isDelete","0"); // 1:删除,0:未删除
        return spuDao.updateByExampleSelective(spu, example);
    }

    /**
     * 逻辑删除
     */
    @Override
    public void deleteGoods(String id) {
        // 修改状态
        Spu spu = spuDao.selectByPrimaryKey(id);
        spu.setIsDelete("1"); // 1:删除,0:未删除
        spuDao.updateByPrimaryKeySelective(spu);
    }

    /**
     * 物理删除
     */
    @Override
    @Transactional // 事务会覆盖类的事务配置信息
    public void removeGoods(String id) {
        // 修改状态
        Spu spu = spuDao.selectByPrimaryKey(id);
        if(spu.getIsDelete().equals("1")){ // 1:删除,0:未删除
            spuDao.deleteByPrimaryKey(spu);
            Example example=new Example(Sku.class);
            Example.Criteria criteria=example.createCriteria();
            criteria.andEqualTo("spuId",id);
            skuDao.deleteByExample(example);
        }
    }

    /**
     * 还原逻辑删除
     */
    @Override
    public void revertGoods(String id) {
        // 修改状态
        Spu spu = spuDao.selectByPrimaryKey(id);
        spu.setIsDelete("0"); // 1:删除,0:未删除
        spuDao.updateByPrimaryKeySelective(spu);
    }

    /**
     * 构建查询条件
     * searchMap
     */
    private Example createExample(Map<String, Object> searchMap){
        Example example=new Example(Spu.class);
        Example.Criteria criteria = example.createCriteria();
        if(searchMap != null){
            // 主键
            if(searchMap.get("id")!=null && !"".equals(searchMap.get("id"))){
                criteria.andLike("id","%"+searchMap.get("id")+"%");
            }
            // 货号
            if(searchMap.get("sn")!=null && !"".equals(searchMap.get("sn"))){
                criteria.andLike("sn","%"+searchMap.get("sn")+"%");
            }
            // SPU名
            if(searchMap.get("name")!=null && !"".equals(searchMap.get("name"))){
                criteria.andLike("name","%"+searchMap.get("name")+"%");
            }
            // 副标题
            if(searchMap.get("caption")!=null && !"".equals(searchMap.get("caption"))){
                criteria.andLike("caption","%"+searchMap.get("caption")+"%");
            }
            // 图片
            if(searchMap.get("image")!=null && !"".equals(searchMap.get("image"))){
                criteria.andLike("image","%"+searchMap.get("image")+"%");
            }
            // 图片列表
            if(searchMap.get("images")!=null && !"".equals(searchMap.get("images"))){
                criteria.andLike("images","%"+searchMap.get("images")+"%");
            }
            // 售后服务
            if(searchMap.get("saleService")!=null && !"".equals(searchMap.get("saleService"))){
                criteria.andLike("saleService","%"+searchMap.get("saleService")+"%");
            }
            // 介绍
            if(searchMap.get("introduction")!=null && !"".equals(searchMap.get("introduction"))){
                criteria.andLike("introduction","%"+searchMap.get("introduction")+"%");
            }
            // 规格列表
            if(searchMap.get("specItems")!=null && !"".equals(searchMap.get("specItems"))){
                criteria.andLike("specItems","%"+searchMap.get("specItems")+"%");
            }
            // 参数列表
            if(searchMap.get("paraItems")!=null && !"".equals(searchMap.get("paraItems"))){
                criteria.andLike("paraItems","%"+searchMap.get("paraItems")+"%");
            }
            // 是否上架
            if(searchMap.get("isMarketable")!=null && !"".equals(searchMap.get("isMarketable"))){
                criteria.andLike("isMarketable","%"+searchMap.get("isMarketable")+"%");
            }
            // 是否启用规格
            if(searchMap.get("isEnableSpec")!=null && !"".equals(searchMap.get("isEnableSpec"))){
                criteria.andLike("isEnableSpec","%"+searchMap.get("isEnableSpec")+"%");
            }
            // 是否删除
            if(searchMap.get("isDelete")!=null && !"".equals(searchMap.get("isDelete"))){
                criteria.andLike("isDelete","%"+searchMap.get("isDelete")+"%");
            }
            // 审核状态
            if(searchMap.get("status")!=null && !"".equals(searchMap.get("status"))){
                criteria.andLike("status","%"+searchMap.get("status")+"%");
            }
            // 品牌ID
            if(searchMap.get("brandId")!=null ){
                criteria.andEqualTo("brandId",searchMap.get("brandId"));
            }
            // 一级分类
            if(searchMap.get("category1Id")!=null ){
                criteria.andEqualTo("category1Id",searchMap.get("category1Id"));
            }
            // 二级分类
            if(searchMap.get("category2Id")!=null ){
                criteria.andEqualTo("category2Id",searchMap.get("category2Id"));
            }
            // 三级分类
            if(searchMap.get("category3Id")!=null ){
                criteria.andEqualTo("category3Id",searchMap.get("category3Id"));
            }
            // 模板ID
            if(searchMap.get("templateId")!=null ){
                criteria.andEqualTo("templateId",searchMap.get("templateId"));
            }
            // 运费模板id
            if(searchMap.get("freightId")!=null ){
                criteria.andEqualTo("freightId",searchMap.get("freightId"));
            }
            // 销量
            if(searchMap.get("saleNum")!=null ){
                criteria.andEqualTo("saleNum",searchMap.get("saleNum"));
            }
            // 评论数
            if(searchMap.get("commentNum")!=null ){
                criteria.andEqualTo("commentNum",searchMap.get("commentNum"));
            }
        }
        return example;
    }

}